package com.example.chapter06;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

/**
 * 这是一个使用SharedPreferences存储用户信息的Activity
 * 功能：通过编辑框输入用户信息（姓名、年龄、身高、体重、婚姻状况），点击保存按钮后将数据存入SharedPreferences
 * 并在Activity创建时自动加载已保存的数据，显示到对应控件上
 */
public class ShareWriteActivity extends AppCompatActivity implements View.OnClickListener {

    // 声明编辑框控件变量，分别对应：姓名、年龄、身高、体重
    private EditText et_name;
    private EditText et_age;
    private EditText et_height;
    private EditText et_weight;
    // 声明复选框控件变量，用于选择是否已婚
    private CheckBox ck_married;
    // 声明SharedPreferences对象，用于存储和读取数据
    private SharedPreferences preferences;

    /**
     * Activity创建时调用的方法，初始化界面和数据
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 设置当前Activity的布局文件（从res/layout/activity_share_write.xml加载）
        setContentView(R.layout.activity_share_write);

        // 初始化控件：通过ID找到布局中的对应控件，并赋值给成员变量
        et_name = findViewById(R.id.et_name);
        et_age = findViewById(R.id.et_age);
        et_height = findViewById(R.id.et_height);
        et_weight = findViewById(R.id.et_weight);
        ck_married = findViewById(R.id.ck_married);

        // 给"保存"按钮设置点击监听器（当前Activity实现了OnClickListener接口，所以监听器是this）
        findViewById(R.id.btn_save).setOnClickListener(this);

        // 获取SharedPreferences实例：
        // 第一个参数"config"是存储文件的名称（会在/data/data/包名/shared_prefs/下生成config.xml文件）
        // 第二个参数Context.MODE_PRIVATE表示该文件只能被当前应用访问
        preferences = getSharedPreferences("config", Context.MODE_PRIVATE);

        // 调用reload方法，加载已保存的数据并显示到控件上
        reload();
    }

    /**
     * 从SharedPreferences中读取已保存的数据，并显示到对应控件
     * 作用：保证Activity重新创建时（如旋转屏幕、再次打开），之前输入的数据不会丢失
     */
    private void reload() {
        // 读取"name"字段的值：
        // 第一个参数是键名，第二个参数是默认值（若未存储过该键，返回null）
        String name = preferences.getString("name", null);
        // 若读取到有效数据（非默认值），则设置到姓名编辑框
        if (name != null) {
            et_name.setText(name);
        }

        // 读取"age"字段的值：默认值为0（表示未存储过）
        int age = preferences.getInt("age", 0);
        // 若年龄不为默认值0，将整数转为字符串后设置到年龄编辑框
        if (age != 0) {
            et_age.setText(String.valueOf(age));
        }

        // 读取"height"字段的值：默认值为0f（浮点型）
        float height = preferences.getFloat("height", 0f);
        // 若身高不为默认值0，转为字符串后设置到身高编辑框
        if (height != 0f) {
            et_height.setText(String.valueOf(height));
        }

        // 读取"weight"字段的值：默认值为0f
        float weight = preferences.getFloat("weight", 0f);
        // 若体重不为默认值0，转为字符串后设置到体重编辑框
        if (weight != 0f) {
            et_weight.setText(String.valueOf(weight));
        }

        // 读取"married"字段的值：默认值为false（未勾选）
        boolean married = preferences.getBoolean("married", false);
        // 根据读取到的布尔值，设置复选框的勾选状态
        ck_married.setChecked(married);
    }

    /**
     * 点击事件回调方法（因为实现了OnClickListener接口）
     * 当"保存"按钮被点击时，会触发此方法
     */
    @Override
    public void onClick(View v) {
        // 从编辑框中获取用户输入的文本（姓名是字符串，直接获取）
        String name = et_name.getText().toString();
        // 获取年龄输入的文本（后续需要转为整数）
        String age = et_age.getText().toString();
        // 获取身高输入的文本（后续需要转为浮点型）
        String height = et_height.getText().toString();
        // 获取体重输入的文本（后续需要转为浮点型）
        String weight = et_weight.getText().toString();

        // 获取SharedPreferences的编辑器（用于写入数据）
        SharedPreferences.Editor editor = preferences.edit();
        // 存入姓名（字符串类型）
        editor.putString("name", name);
        // 存入年龄：将字符串转为整数（注意：若输入为空或非数字，会抛异常，实际开发需加判断）
        editor.putInt("age", Integer.parseInt(age));
        // 存入身高：将字符串转为浮点型
        editor.putFloat("height", Float.parseFloat(height));
        // 存入体重：将字符串转为浮点型
        editor.putFloat("weight", Float.parseFloat(weight));
        // 存入婚姻状况：获取复选框的勾选状态（true为已婚，false为未婚）
        editor.putBoolean("married", ck_married.isChecked());
        // 提交编辑器的修改（将数据写入文件，必须调用此方法才会生效）
        editor.commit();
    }
}